#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/tcp.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
#include <mysql/mysql.h>
#include <ctype.h>
#include <regex.h>

#include "../inc/tcp.h"
#include "../inc/register.h"
#include "../inc/cJSON.h"
#include "../inc/http.h"

// 获取天气的json数据
int handle_weather_cmd(client_info_p client)
{
    char *url = "http://apis.juhe.cn/simpleWeather/query?city=%E5%B9%BF%E5%B7%9E&key=8e1d7ea7ce58f75aeb17cbf74212da15"; // 广州
    char *replyData = malloc(1024);                                                                                     // 先分配内存
    if (replyData == NULL)
    { // 检查分配是否成功
        perror("malloc failed for replyData");
        return 1;
    }

    http_init(url);
    http_setRawHeader("Host", "apis.juhe.cn");
    http_setRawHeader("Content-Type", "application/x-www-form-urlencoded");
    http_get();
    http_reply(&replyData); // 获取响应数据

    // 正则表达式模式：匹配从{开始到最后一个}结束的内容
    const char *pattern = "\\{.*\\}";
    regex_t regex;
    int ret;
    regmatch_t matches[1]; // 存储匹配结果

    // 编译正则表达式
    ret = regcomp(&regex, pattern, REG_EXTENDED);
    if (ret != 0)
    {
        char errbuf[1024];
        regerror(ret, &regex, errbuf, sizeof(errbuf));
        printf("正则表达式编译失败: %s\n", errbuf);
        free(replyData); // 释放内存
        return 1;
    }

    // 执行匹配
    ret = regexec(&regex, replyData, 1, matches, 0);
    if (ret != 0)
    {
        if (ret == REG_NOMATCH)
        {
            printf("未找到匹配的JSON内容\n");
        }
        else
        {
            char errbuf[1024];
            regerror(ret, &regex, errbuf, sizeof(errbuf));
            printf("匹配失败: %s\n", errbuf);
        }
        regfree(&regex);
        free(replyData); // 释放内存
        return 1;
    }

    // 提取匹配到的JSON字符串
    int json_len = matches[0].rm_eo - matches[0].rm_so;
    // 计算需要的总长度：前缀长度 + 实际JSON内容长度
    const char *prefix = "{\"type\":\"weather\",";
    int prefix_len = strlen(prefix);
    char *json_str = (char *)malloc(prefix_len + json_len); // 额外空间用于拼接
    if (json_str == NULL)
    {
        printf("内存分配失败 for json_str\n");
        regfree(&regex);
        free(replyData); // 释放内存
        return 1;
    }

    // 安全地拼接字符串
    strcpy(json_str, prefix);
    // 确保不会超过缓冲区大小
    strncat(json_str, replyData + matches[0].rm_so + 1,
            (prefix_len + json_len - 1) - prefix_len);
    json_str[prefix_len + json_len - 1] = '\0'; // 正确设置结束符

    // 输出结果
    printf("提取到的JSON内容:\n%s\n", json_str);
    send_message_to_client(client->connfd, json_str);

    // 释放所有分配的资源
    free(json_str);
    regfree(&regex);
    http_destory();
    return 0;
}